﻿// owner 蒋家伟

#pragma once
#include "Device_home.h"

namespace jsdk
{
    class TaskId;
    class IDeviceExternalData;
    // 类别描述 ： 所有设备(软硬件) 的基类, 任务派发的基础。
    // 注意     : 如果期望一个对象支持任务执行、接受分发的任务，请从此类继承, 并注册给设备管理器。详情见IDeviceRegisterHelper
    class DEVICE_EXPORT IDevice
    {
    public:
        virtual ~IDevice() {}

        /// \ 设备开始工作
        /// \ return true 表示设备开始工作，false则是存在异常
        virtual bool start() = 0;

        /// \ 设备停止工作
        virtual void stop() = 0;

        /// \ brief 是否在线
        /// \ true 在线
        virtual bool isOnline() const = 0;

        /// \ 添加一个任务
        /// \ note : 调用此接口的框架所在线程是独立的，因此想要将任务放置到自己的工作线程请通过信号与槽进行传递之后再处理对应的Task
        virtual void addTask(const TaskId& taskId) const = 0;

        /// \ 获取设备的名称
        virtual const std::wstring getDeviceName() const = 0;

        /// \ brief 获取只读外部数据
        virtual const IDeviceExternalData* getExternalData() const = 0;

        /// \ brief 获取可写的外部数据
        virtual IDeviceExternalData* getExternalDataFW() = 0;
    };
}

// 如果该设备没有外部数据，则可以使用以下的宏完成纯虚函数的实现。
#define NO_EXTERNAL_DATA_DEVICE_IMP \
virtual const IDeviceExternalData* getExternalData() const override {return nullptr;} \
virtual IDeviceExternalData* getExternalDataFW() override {return nullptr;}
